package com.atguigu.gmall.order.service;

import com.atguigu.gmall.model.enums.ProcessStatus;
import com.atguigu.gmall.model.order.OrderInfo;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;

import java.util.List;
import java.util.Map;

/**
 * @author mgx
 * @version 1.0
 * @description: TODO
 * @date 2022-12-10 13:50
 */
public interface OrderService extends IService<OrderInfo> {
    /**
     * 提交订单 -- 下单
     * @param orderInfo
     * @return
     */
    Long submitOrder(OrderInfo orderInfo);

    /**
     * 生成流水号
     * @param userId
     * @return
     */
    String getTradeNo(String userId);

    /**
     * 校验流水号
     * @param userId
     * @param tradeNo
     * @return
     */
    boolean checkTradeCode(String userId, String tradeNo);

    /**
     * 删除流水号
     * @param userId
     */
    void deleteTradeNo(String userId);

    /**
     * 校验库存
     * @param skuId
     * @param skuNum
     * @return
     */
    boolean checkStock(Long skuId, Integer skuNum);

    /**
     * 获取当前用户的我的订单
     * @param pageParam
     * @param userId
     * @return
     */
    IPage<OrderInfo> getPage(Page<OrderInfo> pageParam, String userId);

    /**
     * 关闭订单
     * @param orderId 订单id
     */
    void execExpiredOrder(Long orderId, String flag);


    /**
     * 根据订单Id 修改订单的状态
     * @param orderId
     * @param processStatus
     */
    void updateOrderStatus(Long orderId, ProcessStatus processStatus);

    /**
     * 获取订单详情
     * @param orderId
     * @return
     */
    OrderInfo getOrderInfoById(Long orderId);

    /**
     *  通知仓储扣减库存
     * @param orderId 订单id
     */
    void sendOrderStatus(Long orderId);

    /**
     * 数据转换
     * @param orderInfo 订单信息
     * @return
     */
    Map<String, Object> initWareOrderMap(OrderInfo orderInfo);

    /**
     * 拆单
     * @param orderId 订单id
     * @param wareSkuMap 仓库与sku的对应关系
     * @return 子订单集合
     */
    List<OrderInfo> orderSplit(String orderId, String wareSkuMap);
}
